package com.appleyk.mybatis.v1.mapper;

import com.appleyk.mybatis.annotation.MySelect;
import com.appleyk.mybatis.model.User;
import org.springframework.stereotype.Component;

/**
 * <p>越努力，越幸运</p>
 * v1版本，借助spring框架自带的扫包注解，然后结合BeanFactoryPostProcessor+FactoryBean两个接口
 * 来实现接口的动态代理，然后通过反射拿到接口（mapper）中方法上的注解属性，在代理对象invoke方法进行调用
 * ，上面描述用牛逼的话说，就是偷天换日！因为，我们知道接口是无法实例化的，要想实例话，还想注入到ioc容器
 * 除非用动态代理，别无选择，然后选择用动态代理的时机也是相当的重要的
 * 对spring源码稍微看过和调试过的小伙伴，必然是知道bean的生命周期的，从读取bean定义到ioc容器
 * ，到bean的实例化，再到bean的初始化，短短三个步骤节点，其前前后后究竟还有哪些增强器在发挥着作用？
 * 值得我们去探究以及熟练运用，掌握了spring bean ioc容器的奥妙后，一切基于spring生态的框架就都是浮云了
 * @author appleyk
 * @version V.0.1.1
 * @blob https://blog.csdn.net/appleyk
 * @date created on  11:25 下午 2020/12/11
 */

/**
 *  我们知道，接口是无法实例化的，但是我们明知山有虎，偏向虎山行
 *  为什么，因为我们有BeanFactoryPostProcessor利器，还有FactoryBean接口
 *  来定制化我们的bean（其实框架的大多数奥秘就是抽象、接口、反射和动态代理）
 */
@Component // 按常理来说，这个注解不能加在接口上，因为接口不满足bean定义注册的条件
public interface UserMapper {
    // 用我们自定义的注解，没别的，就是骚，因为是手写，不存在mybatis的任何原生注解
    @MySelect("select*from t_user where id = ?")
    User findById(Long uid);
}
